// 1. 定义策略接口  
class DiscountStrategy {  
    calculateDiscount(price) {  
    //   throw new Error('子类必须实现 calculateDiscount 方法');  
        return price;
    }  
  }  
    
  // 2. 实现具体的策略   无折扣 返回原价
  class NoDiscountStrategy extends DiscountStrategy {  
    calculateDiscount(price) {  
      return price;  
    }  
  }  
//    百分比折扣，
  class PercentageDiscountStrategy extends DiscountStrategy {  
    constructor(percentage) {  
      super();  
      this.percentage = percentage;  
    }  
    
    calculateDiscount(price) {  
      return price * (1 - this.percentage / 100);  
    }  
  }  
//   固定折扣
  class FixedAmountDiscountStrategy extends DiscountStrategy {  
    constructor(amount) {  
      super();  
      this.amount = amount;  
    }  
    
    calculateDiscount(price) {  
      return price - this.amount;  
    }  
  }  
    
  // 3. 上下文类，使用策略  
  class ShoppingCart {  
    constructor(discountStrategy) {  
      this.discountStrategy = discountStrategy;  
    }  
    
    setDiscountStrategy(discountStrategy) {  
      this.discountStrategy = discountStrategy;  
    }  
    
    calculateTotal(price) {  
      return this.discountStrategy.calculateDiscount(price);  
    }  
  }  
    
  // 4. 使用策略模式  
  const cart = new ShoppingCart(new NoDiscountStrategy());  
  console.log(cart.calculateTotal(100)); // 输出: 100，没有折扣  
    
  cart.setDiscountStrategy(new PercentageDiscountStrategy(20));   
  console.log(cart.calculateTotal(100)); // 输出: 80，20%折扣  
    
  cart.setDiscountStrategy(new FixedAmountDiscountStrategy(15));  
  console.log(cart.calculateTotal(100)); // 输出: 85，固定15元折扣
//   每次调用 calculateTotal 方法时，它都会根据当前设置的折扣策略来计算总价。
//   因此，当我们将折扣策略更改为固定金额折扣时，calculateTotal 方法会使用这个新的策略来计算价格，
//   但它会基于传入的原始价格（在这个例子中是100元）来计算，而不是基于之前计算出的折扣后价格。


// NoDiscountStrategy 类可以正确工作，因为它直接提供了 calculateDiscount 方法的实现，
// 而不需要与父类的任何特定初始化或方法实现进行交互。

// 同样的情况也适用于其他两个子类 PercentageDiscountStrategy 和 FixedAmountDiscountStrategy，但在这些子类中，
// super() 被调用是为了确保如果将来 DiscountStrategy 基类添加了构造函数逻辑，
// 这些子类将能够正确地继承这些逻辑（尽管在当前代码中这不是必需的）。